package com.zmn.plat.business.interfaces.product;

import java.util.ArrayList;
import java.util.List;

import com.zmn.common.dto.StatusDTO;
import com.zmn.plat.common.dto.category.AssSimpleCategoryDRO;
import com.zmn.plat.common.dto.product.base.ProductBaseDRO;
import com.zmn.plat.model.dto.BaseCategoryAttributeDTO;
import com.zmn.plat.model.dto.product.ProductRelationDTO;
import com.zmn.plat.model.entity.category.BaseCategory;
import com.zmn.plat.model.entity.product.FicoCategory;
import com.zmn.plat.model.entity.product.ServProduct;
import com.zmn.plat.model.entity.product.ServProductQuery;
import com.zmn.plat.model.entity.servcategory.ServCategory;
import com.zmn.plat.model.vo.product.ServProductBackVO;
import com.zmn.plat.model.vo.product.ServProductCopyVO;
import com.zmn.plat.model.vo.product.ServProductVO;
import com.zmn.plat.model.vo.servcategory.BaseCategoryAttributeVO;

/**
 * 描述:BaseCodeMapBService
 *
 * @author tanghongjun
 * @since: 2018/10/16 17:56
 */
public interface ServProductBService {
    /**
     * 描述: 根据产品分类查询属性信息
     *
     * @param baseCategory
     *            基础产品分类
     * @return:
     * @auther: tanghongjun
     * @since: 2018/11/20 20:57
     */
    List<BaseCategoryAttributeDTO> getServProductOfAttribute(BaseCategory baseCategory);

    /**
     * 描述: 根据产品分类ID找到产品分类名称
     *
     * @param baseCategorieall
     * @param categId
     * @return:
     * @auther: tanghongjun
     * @since: 2018/11/20 20:58
     */
    String findBaseCategNameById(List<BaseCategory> baseCategorieall, Integer categId);

    /**
     * 描述: 根据服务分类名称找到服务分类名称
     *
     * @param servCategories
     * @param categId
     * @param showType
     * @return:
     * @auther: tanghongjun
     * @since: 2018/11/20 20:58
     */
    String findServCategNameById(List<ServCategory> servCategories, Integer categId, Integer showType);

    /**
     * 描述: 根据一二级分类查询所有属性和属性值
     *
     * @param categOneId
     * @param categId
     * @return:
     * @auther: tanghongjun
     * @since: 2018/11/20 20:58
     */
    List<BaseCategoryAttributeVO> findAttrById(Integer categOneId, Integer categId, Integer channelId);

    /**
     * 描述: 根据绩效分组ID找到绩效分组名称
     *
     * @param ficoCategoryList
     * @param ficoCtegId
     * @return:
     * @auther: tanghongjun
     * @since: 2018/11/20 20:58
     */
    String findFicoCategNameById(List<FicoCategory> ficoCategoryList, Integer ficoCtegId);

    /**
     * 描述: 根据服务分类ID、一级产品分类ID、二级产品分类ID，查询产品
     *
     * @param servCategId
     *            服务分类ID
     * @param categOneId
     *            一级产品分类ID
     * @param categId
     *            二级产品分类ID
     * @return:
     * @auther: tanghongjun
     * @since: 2018/11/20 20:59
     */
    List<ServProduct> listById(Integer servCategId, Integer categOneId, Integer categId);

    /**
     * 描述: 根据服务分类ID、一级产品分类ID、二级产品分类ID，查询产品 分以下三种情况 1.channelId 为指定的渠道,productType为null，查询渠道产品+通用产品 2.channelId为空（null）productType为1，查询通用产品
     * 3.channelId 为指定的渠道,productType为2，查询渠道专属产品
     * 
     * @param servCategId
     *            服务分类ID
     * @param categOneId
     *            产品1级分类ID
     * @param categId
     *            产品2级分类ID
     * @param channelId
     *            产品所属的渠道id
     * @param productType
     *            产品类型
     */
    List<ServProduct> listByServCategIdAndCategOneIdAndCategIdAndChannelIdAndProductType(Integer servCategId, Integer categOneId, Integer categId, Integer channelId, Integer productType);

    /**
     * 描述:根据渠道ID，服务分类，产品二级分类ID查询渠道开通产品
     *
     * @param channelId
     *            渠道ID
     * @param servCategId
     *            服务分类ID
     * @param categId
     *            产品2级分类ID
     * @return:
     * @auther: tanghongjun
     * @since: 2018/10/31 20:23
     */
    List<ServProduct> listByChannelIdAndServCategIdAndCategId(Integer channelId, Integer servCategId, Integer categId);

    /**
     * 描述: 根据渠道ID和产品基本信息分页查询渠道开通产品
     *
     * @param channelId
     *            渠道ID
     * @param servProductQuery
     *            产品查询条件
     * @return 产品集合
     * @auther tanghongjun
     * @since 2019/9/7 11:29
     */
    List<ServProduct> listByChannelIdAndProductQuery(Integer channelId, ServProductQuery servProductQuery);

    /**
     * 描述: 后台产品下架的检查
     *
     * @param productIds
     *            产品id
     * @param showType
     *            产品类型
     * @return List<ServProduct>
     * @auther tanbiao
     * @since 2018/10/15 16:41
     */
    List<ServProductBackVO> listProductAndFilterByStatus(List<Integer> productIds, Integer showType);

    /**
     * 描述: 根据渠道ID和产品基本信息分页查询渠道开通产品条数
     *
     * @param channelId
     *            渠道ID
     * @param servProductQuery
     *            产品查询条件
     * @return 产品集合
     * @auther tanghongjun
     * @since 2019/9/7 11:29
     */
    Integer countByChannelIdAndProductQuery(Integer channelId, ServProductQuery servProductQuery);

    /**
     * 描述: 新增产品信息
     *
     * @param servProduct
     * @return: 执行状态码
     * @auther: tanghongjun
     * @since: 2018/10/16 19:00
     */
    Integer insert(ServProduct servProduct);

    /**
     * 描述: 新增产品信息
     *
     * @param creater
     *            创建者
     * @param servProductVO
     *            产品页面展示实体
     * @return: 执行状态码
     * @auther: tanghongjun
     * @since: 2018/10/16 19:00
     */
    Integer insertAll(ServProductVO servProductVO, String creater);

    /**
     * 描述: 根据主键修改产品信息
     *
     * @param servProductVO
     * @param updator
     * @return: 执行状态码
     * @auther: tanghongjun
     * @updater wangjie 2019-07-23 添加排序字段
     * @since: 2018/10/16 19:00
     */
    Integer updateAll(ServProductVO servProductVO, String updator);

    /**
     * 描述:根据产品ID修改产品状态
     *
     * @param newsId
     * @param status
     *            状态
     * @param updater
     *            修改者
     * @return:
     * @auther: tanghongjun
     * @since: 2018/10/22 14:02
     */
    Integer updateStatus(Integer newsId, Integer status, String updater);

    /**
     * 描述:根据产品ID修改产品状态
     *
     * @param servProduct
     * @return:
     * @auther: tanghongjun
     * @since: 2018/10/22 14:02
     */
    Integer updateStatus(ServProduct servProduct);

    /**
     * 描述:根据产品ID批量修改产品状态
     *
     * @param productIds
     * @param status
     *            状态
     * @param updater
     *            修改者
     * @param showType
     *            产品类型
     * @return:
     * @auther: tanghongjun
     * @since: 2018/10/22 14:02
     */
    Integer updateStatusBatch(List<Integer> productIds, Integer status, String updater, Integer showType);

    /**
     * 描述:根据产品ID批量修改产品状态
     *
     * @param dto
     * @return:
     * @auther: tanghongjun
     * @since: 2018/10/22 14:08
     */
    Integer updateStatusBatch(StatusDTO dto);

    /**
     * 描述: 根据查询条件查询产品，并翻译分类名称
     *
     * @param query
     *            产品查询Query
     * @param baseCategorieall
     *            产品分类集合
     * @param servCategories
     *            服务分类集合
     * @return
     * @auther tanghongjun
     * @since 2020/3/3 16:45
     */
    List<ServProductVO> listShowVOPageByQuery(ServProductQuery query, List<ServCategory> servCategories, List<BaseCategory> baseCategorieall);

    /**
     * 描述: 根据查询条件查询计价器产品，并翻译分类名称
     *
     * @param query
     *            产品查询Query
     * @param baseCategorieall
     *            产品分类集合
     * @param servCategories
     *            服务分类集合
     * @return
     * @auther tanghongjun
     * @since 2020/3/3 16:45
     */
    List<ServProductVO> listTariffVOPageByQuery(ServProductQuery query, List<ServCategory> servCategories, List<BaseCategory> baseCategorieall);

    /**
     * 描述: 根据条件导出后台产品报表
     *
     * @param query
     *            查询条件
     * @return java.util.ArrayList<java.util.List>
     * @author tanghongjun
     * @since 2019年12月16日11:36:02
     **/
    ArrayList<List> outputProductExcel(ServProductQuery query);

    /**
     * 描述: 根据条件导出前台报表
     *
     * @param query
     *            查询条件
     * @return java.util.ArrayList<java.util.List>
     * @author tanghongjun
     * @since 2019年12月16日11:36:02
     **/
    ArrayList<List> outputShowProductExcel(ServProductQuery query);

    /**
     * 描述: 根据条件导出计价器报表
     *
     * @param query
     *            查询条件
     * @return java.util.ArrayList<java.util.List>
     * @author tanghongjun
     * @since 2019年12月16日11:36:02
     **/
    ArrayList<List> outputTariffProductExcel(ServProductQuery query);

    /**
     * 描述: 根据前台产品ID获取后台产品信息，并返回对应产品的服务分类、一级分类、二级分类信息
     *
     * @param showProductId
     *            前台产品ID
     * @return com.zmn.common.dto2.ResponseDTO《com.zmn.plat.common.dto.category.AssSimpleCategoryDRO》
     * @author tanghongjun
     * @since 2020年7月17日15:45:45
     **/
    List<AssSimpleCategoryDRO> listAssSimpleCategByShowProductId(Integer showProductId);

    /**
     * 描述: 根据后台产品ID获取前台产品
     *
     * @param productId
     *            后台产品ID
     * @param status
     *            产品状态，可以为空，为空则查询所有复合条件的前台产品
     * @return FaultProductDRO 产品DRO集合
     * @auther tanghongjun
     * @since 2019/9/23 14:29
     */
    List<ProductBaseDRO> listProductByProductIdAndStatus(Integer productId, Integer status);

    /**
     * 描述: 根据前台产品ID获取后台产品 分以下三种情况 1.channelId 为指定的渠道,productType为null，查询渠道产品+通用产品 2.channelId为空（null）productType为1，查询通用产品 3.channelId
     * 为指定的渠道,productType为2，查询渠道专属产品
     *
     * @param showProductId
     *            前台产品ID
     * @param status
     *            产品状态，可以为空，为空则查询所有复合条件的后台产品
     * @param channelId
     *            产品所属的渠道id
     * @param productType
     *            产品类型
     * @return ProductBaseDRO 后台产品DRO集合
     * @auther tanghongjun
     * @since 2019/9/23 14:29
     */
    List<ProductBaseDRO> listProductByShowProductIdAndStatusAndChannelIdAndProductType(Integer showProductId, Integer status, Integer channelId, Integer productType);

    /**
     * 描述: 根据产品id查询前后台计价器产品间的关系
     *
     * @param productIdList
     *            产品ID
     * @param showType
     *           产品类型
     * @return ProductBaseDRO 后台产品DRO集合
     */
    List<ProductRelationDTO> listProductRalationByIdListAndShowType(List<Integer> productIdList, Integer showType);

    /**
     * 描述: 根据产品id应用信息到其他产品
     *
     * @param servProductCopyVO
     *            拷贝实体
     * @return ProductBaseDRO 后台产品DRO集合
     */
    Integer copyFromProduct(ServProductCopyVO servProductCopyVO);
}
